/**
 * Description:
 * Class Name:MethodHandleTest
 * Date:2022/2/22 12:02
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第7章_Java基础类库._7_6_变量处理和方法处理._7_6_1_Java9增强的MethodHandle;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

public class MethodHandleTest {
    // 定义一个private类方法
    private static void hello(){
        System.out.println("Hello world!");
    }
    // 定义一个private实例方法
    private String hello(String name){
        System.out.println("执行带参数的hello" + name);
        return name + "，您好";
    }

    public static void main(String[] args) throws Throwable{
        // 定义一个返回值为void、不带形参的方法类型
        MethodType type = MethodType.methodType(void.class);
        // 使用MethodHandles.Lookup的findStatic获取方法名为"hello"的类方法
        MethodHandle mtd = MethodHandles.lookup().findStatic(MethodHandleTest.class, "hello", type);
        // 通过MethodHandle执行方法
        mtd.invoke();
        // 使用MethodHandles.Lookup的findVirtual获取方法名为"hello"的实例方法
        MethodHandle mtd2 = MethodHandles.lookup().findVirtual(MethodHandleTest.class, "hello",
                // 指定获取返回值（左）为String、形参（右）为String的方法类型
                MethodType.methodType(String.class, String.class));
        // 通过MethodHandle执行方法，实例方法的话传入主调对象和参数
        System.out.println(mtd2.invoke(new MethodHandleTest(), "孙悟空"));
    }
}

// 输出结果为：
//Hello world!
//执行带参数的hello孙悟空
//孙悟空，您好